#include <REGX52.H>

// 按键定义
sbit K1 = P3^0;  // 功能模式按键（模式切换）
sbit K2 = P3^1;  // 菜单前进按键
sbit K3 = P3^2;  // 菜单后退按键

// 系统状态定义
#define MODE_FLOW_FORWARD  0
#define MODE_FLOW_BACKWARD 1
#define MODE_TIMER_UP      2
#define MODE_TIMER_DOWN    3
#define MODE_MAX           4

// 全局变量
unsigned char system_mode = MODE_FLOW_FORWARD;
unsigned char timer_value = 0;      // 计时器值 (0-255)
unsigned char flow_position = 0;    // 流水灯位置
unsigned int counter_10ms = 0;      // 10ms计数器

// 按键状态变量
bit key1_pressed = 0;
bit key2_pressed = 0;
bit key3_pressed = 0;

// 定时器初始化
void timer0_init() {
    TMOD = 0x01;    // 定时器0，模式1（16位定时器）
    TH0 = 0xFC;     // 定时1ms (11.0592MHz晶振)
    TL0 = 0x66;
    TR0 = 1;        // 启动定时器0
    ET0 = 1;        // 允许定时器0中断
    EA = 1;         // 开启总中断
}

// 改进的按键扫描函数
void key_scan() {
    static bit key1_last = 1, key2_last = 1, key3_last = 1;
    
    // 检测K1（功能模式按键）
    if (K1 == 0) {
        if (key1_last == 1) { // 检测下降沿
            if (K1 == 0) {
                key1_pressed = 1;
            }
        }
        key1_last = 0;
    } else {
        key1_last = 1;
    }
    
    // 检测K2（菜单前进按键）
    if (K2 == 0) {
        if (key2_last == 1) {
            if (K2 == 0) {
                key2_pressed = 1;
            }
        }
        key2_last = 0;
    } else {
        key2_last = 1;
    }
    
    // 检测K3（菜单后退按键）
    if (K3 == 0) {
        if (key3_last == 1) {
            if (K3 == 0) {
                key3_pressed = 1;
            }
        }
        key3_last = 0;
    } else {
        key3_last = 1;
    }
}

// 处理按键事件
void handle_keys() {
    // 处理K1（模式切换）
    if (key1_pressed) {
        key1_pressed = 0;
        system_mode = (system_mode + 1) % MODE_MAX;
        
        // 模式切换时重置状态
        timer_value = 0;
        flow_position = 0;
        counter_10ms = 0;
        P2 = 0xFF; // 关闭所有LED
    }
    
    // 处理K2（前进）
    if (key2_pressed) {
        key2_pressed = 0;
        
        if (system_mode == MODE_TIMER_UP || system_mode == MODE_TIMER_DOWN) {
            if (timer_value < 255) timer_value++;
            P2 = ~timer_value; // 更新LED显示
        }
    }
    
    // 处理K3（后退）
    if (key3_pressed) {
        key3_pressed = 0;
        
        if (system_mode == MODE_TIMER_UP || system_mode == MODE_TIMER_DOWN) {
            if (timer_value > 0) timer_value--;
            P2 = ~timer_value; // 更新LED显示
        }
    }
}

// 执行当前模式
void execute_mode() {
    switch (system_mode) {
        case MODE_FLOW_FORWARD: // 正向流水灯
            if (counter_10ms >= 25) { // 250ms
                counter_10ms = 0;
                P2 = ~(0x01 << flow_position); // 点亮当前LED
                flow_position = (flow_position + 1) % 8;
            }
            break;
            
        case MODE_FLOW_BACKWARD: // 反向流水灯
            if (counter_10ms >= 25) { // 250ms
                counter_10ms = 0;
                P2 = ~(0x80 >> flow_position); // 点亮当前LED
                flow_position = (flow_position + 1) % 8;
            }
            break;
            
        case MODE_TIMER_UP: // 正向计时
            if (counter_10ms >= 100) { // 1秒
                counter_10ms = 0;
                if (timer_value < 255) {
                    timer_value++;
                    P2 = ~timer_value; // 更新LED显示
                }
            }
            break;
            
        case MODE_TIMER_DOWN: // 倒计时
            if (counter_10ms >= 100) { // 1秒
                counter_10ms = 0;
                if (timer_value > 0) {
                    timer_value--;
                    P2 = ~timer_value; // 更新LED显示
                }
            }
            break;
    }
}

void main(void) {
    P2 = 0xFF; // 初始关闭所有LED
    timer0_init(); // 初始化定时器
    
    while (1) {
        key_scan();      // 扫描按键
        handle_keys();   // 处理按键事件
        execute_mode();  // 执行当前模式
    }
}

// 定时器0中断服务函数（1ms中断）
void Timer0_ISR() interrupt 1 {
    static unsigned int ms_counter = 0;
    
    // 重新装载初值
    TH0 = 0xFC;
    TL0 = 0x66;
    
    // 每1ms增加一次计数器
    ms_counter++;
    
    // 每10ms增加一次主计数器
    if (ms_counter >= 10) {
        ms_counter = 0;
        counter_10ms++;
    }
} 